package com.hongyi.app.aspect;

import com.hongyi.app.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import sun.rmi.runtime.Log;

import java.util.List;

/**
 * @author HongYi
 */


@Slf4j
public class ServiceAspect {

     /**
     * @param pjp 固定参数，获取业务方法的参数并且通过反射调用业务方法
     * @return Object 返回值类型固定，业务方法的返回值
     */

    public Object aroundAdvice(ProceedingJoinPoint pjp) {

        Object returnValue = null;
        try {

            //AOP前置通知：若参数中存在null值，则直接抛出异常，以触发AOP异常通知
            Object[] args = pjp.getArgs();

            for (Object arg : args) {
                if (arg == null) {
                    throw new NullPointerException("AOP前置通知，参数中存在null值···");
                }

            }

            //调用业务方法
            returnValue = pjp.proceed(args);

            //如果返回值User或List<User>类型，则隐藏实体类中的密码属性
            if (returnValue instanceof User) {
                User user = (User) returnValue;
                user.setPassword(null);
                log.info("AOP返回后通知，隐藏user中的密码");
                return user;
            }

            if (returnValue instanceof List) {
                Object obj = ((List) returnValue).get(0);
                if (obj instanceof User) {
                    List<User> users = (List<User>) returnValue;
                    users.forEach(e->e.setPassword(null));
                    log.info("AOP返回后通知，隐藏user中的密码");
                    return users;
                }

            }
        } catch (Throwable e) {

            log.error("AOP异常通知：" + e);
        } finally {

            log.info("AOP后置通知：操作完成，记录本次操作的日志···");
        }
        return returnValue;
    }

}

